#include "Mesh/VertexTemplate.h"

/*********************************
 *          Public
 *********************************/

    /*********************************
     *          Constructor
     *********************************/

        VertexTemplate::VertexTemplate(){
            SetOffset();
            m_Size=0;
            VertexTemplates.push_back(this);
        }

    /*********************************
     *          Get/Set
     *********************************/

        AttributeTemplate &     VertexTemplate::attribute(int pos){
            return *(m_Attributes.at(pos));
        }

        AttributeTemplate &     VertexTemplate::lastAttribute(){
            return *(m_Attributes.back());
        }

        Vertex & VertexTemplate::last(){
            return *(m_Vertices.back());
        }

        Vertex & VertexTemplate::vertex(int i){
            return *(m_Vertices.at(i));
        }


        int VertexTemplate::attributeCount(){
            return m_Attributes.size();
        }

        /*! @brief Taille qu'occupe un sommet du VertexTemplate */
        int VertexTemplate::size(){
            return m_Size;
        }

        /*! @brief Taille qu'occupe les sommets du VertexTemplate en cours dans le VerticeBuffer */
        int VertexTemplate::sizeVertices(){
            return m_Size* m_Vertices.size();
        }

        /*! @brief Position ou débute les sommets du VertexTemplate courant à l'intérieur du
         *  VerticeBuffer   */
        int VertexTemplate::offset(){
            return m_Offset;
        }

        vector<AttributeTemplate * > & attributes();

    /*********************************
     *          Methods
     *********************************/

        void VertexTemplate::AddAttribute(int size, string name){
            AddAttribute(size, name, -1);
        }

        void VertexTemplate::AddAttribute(int size, string name, GLuint id){
            m_Attributes.push_back(new AttributeTemplate(size, name, id, GetAttributeOffset()));
            m_Size+=size;
        }

        Vertex & VertexTemplate::NewVertex(){
            m_Vertices.push_back(new Vertex(*this));
            m_Vertices.back()->vertexId=m_Vertices.size()-1;
            return *m_Vertices.back();
        }

    /*********************************
     *          Static Properties
     *********************************/

        VertexTemplate              VertexTemplate::DefaultTemplate;
        vector<VertexTemplate*>     VertexTemplate::VertexTemplates;

    /*********************************
     *          Private
     *********************************/

        /*********************************
         *          Methods
         *********************************/


                int     VertexTemplate::GetAttributeOffset(){
                    if(m_Attributes.size()==0){
                        return 0;
                    } else{
                        return (m_Attributes.back()->offset() + m_Attributes.back()->size());
                    }
                }

                void VertexTemplate::SetOffset(){
                    if(VertexTemplates.size()==0){
                        m_Offset    =   0;
                    }else{
                        m_Offset    =   VertexTemplates.back()->offset()+ VertexTemplates.back()->sizeVertices();
                    }

                }



